package org.xurui.bsj.protocol.command.impl;

import lombok.extern.slf4j.Slf4j;
import org.hswebframework.web.bean.FastBeanCopier;
import org.jetlinks.core.message.CommonDeviceMessage;
import org.jetlinks.core.message.DeviceMessage;
import org.jetlinks.core.message.codec.EncodedMessage;
import org.jetlinks.core.message.codec.FromDeviceMessageContext;
import org.jetlinks.core.message.event.EventMessage;
import org.jetlinks.core.message.property.WritePropertyMessage;
import org.springframework.util.StringUtils;
import org.xurui.bsj.protocol.command.CmdCodec;
import org.xurui.bsj.protocol.enums.CommandEnum;
import org.xurui.bsj.protocol.msg.BsjMessage;
import org.xurui.bsj.protocol.msg.BsjMessageBuilder;
import org.xurui.bsj.protocol.utils.ArrayUtils;
import org.xurui.bsj.protocol.utils.BinaryUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 4.3.7. 健康信息获取（可选）
 */
@Slf4j
public class CmdCodec_GET_HEALTH_INFO implements CmdCodec {
    @Override
    public boolean supportsCmd(String cmd) {
        return CommandEnum.GET_HEALTH_INFO.name().equals(cmd);
    }

    @Override
    public List<DeviceMessage> parsePayload(BsjMessage payload, FromDeviceMessageContext context) {
        //例子：[866136055799444,89860477012170573202,202203181413300009,GET_HEALTH_INFO,3,20220318141330,1,0]
        /**
         * 报文体格式：预留
         * 说明： 预留。
         */
        //设备上报事件
        EventMessage eventMessage = new EventMessage();
        eventMessage.setDeviceId(payload.getHeader().getDeviceNo());
        eventMessage.setEvent(payload.getHeader().getCmd());
        eventMessage.setMessageId(payload.getHeader().getOrderNo());
        eventMessage.setTimestamp(System.currentTimeMillis());
        Map<String, Object> properties = new HashMap<>();
        String tempBody = payload.getTempBody();
        String[] tempBodyArr = tempBody.split("@");
        //properties.put("header", FastBeanCopier.copy(payload.getHeader(), HashMap::new));
        properties.put("header", payload.getHeader().toMap());

        /**
         * healthInfo
         */
        properties.put("healthInfo", ArrayUtils.getStrByIndex(tempBodyArr,0));
        eventMessage.setData(properties);

        //回复消息
        //标识通信方向，取值如下: 1.下发请求 2.下发响应 3.上报请求 4.上报响应
        //说明：平台下发请求标示 1，则终 端响应标示为 2，终端上报接口标 示为 3，平台响应标示为 4
        //组装需要回复设备消息提
        /**
         * 报文体格式： 表示健康二维码的字符串
         *            @表示卡姓名
         * !表示卡电话号码
         * #表示(二维码类型) $表示（行程码类型）
         * 说明：
         * 健 康 二 维 码 的 字 符 串 ：
         * http://bsj_green_code
         * 姓名：李四
         * 卡电话号码：13614561333
         * 二维码类型：0 绿码，1 黄码，2 红码 3 灰码
         * 行程码类型：0:可通行/1:低风险/2:高风险/3:未找到行/4 非法
         * 备注：(非绿码一律不通过)
         * 异常应答：0=无设置，1=非平台用户，2=其他异常
         */
        //示例：[866136055799444,89860477012170573202,202203181413300009,GET_HEALTH_INFO,4,20220318141332,25,http://bsj_green_code@ 李 四!13614561333#0$0]
        //TODO 设备请求 响应报文定义
        //payload.setTempReplyBody("0");
        payload.setWithOutRelayToDevice(true);
        return genDeviceMessage(eventMessage);
    }

    @Override
    public EncodedMessage encodeMessage(CommonDeviceMessage message, String zzs) {
        //平台下发消息
        //例子：[866136055799444,89860477012170573202,202203181413300009,GET_HEALTH_INFO,4,20220318141332,25,http://bsj_green_code@ 李 四!13614561333#0$0]
        /**
         * 报文体格式： 表示健康二维码的字符串
         *            @表示卡姓名
         *           !表示卡电话号码
         *           #表示(二维码类型)
         *           $表示（行程码类型）
         * 说明：
         * 健 康 二 维 码 的 字 符 串 ：http://bsj_green_code
         * 姓名：李四
         * 卡电话号码：13614561333
         * 二维码类型：0 绿码，1 黄码，2 红码 3 灰码
         * 行程码类型：0:可通行/1:低风险/2:高风险/3:未找到行/4 非法
         * 备注：(非绿码一律不通过)
         * 异常应答：0=无设置，1=非平台用户，2=其他异常
         */
        if(message instanceof WritePropertyMessage) {
            WritePropertyMessage m = (WritePropertyMessage) message;
            Map<String,Object> params = m.getProperties();
            String  qrCodeUrl = "";
            if(params.get("qrCodeUrl")!=null && !params.get("qrCodeUrl").equals("")) {
                qrCodeUrl=params.get("qrCodeUrl").toString();
            }
            String  name = "";
            if(params.get("name")!=null && !params.get("name").equals("")) {
                name=params.get("name").toString();
            }
            String  phone = "";
            if(params.get("phone")!=null && !params.get("phone").equals("")) {
                phone=params.get("phone").toString();
            }
            String  qrCodeType = "";
            if(params.get("qrCodeType")!=null && !params.get("qrCodeType").equals("")) {
                qrCodeType=params.get("qrCodeType").toString();
            }
            String  travelCodeType = "";
            if(params.get("travelCodeType")!=null && !params.get("travelCodeType").equals("")) {
                travelCodeType=params.get("travelCodeType").toString();
            }

            String responseStatus="";
            if(params.get("responseStatus")!=null && !params.get("responseStatus").equals("")) {
                responseStatus=params.get("responseStatus").toString();
            }

            StringBuffer sb = new StringBuffer();
            if(StringUtils.isEmpty(responseStatus)){
                sb.append(qrCodeUrl);
                sb.append(BinaryUtils.CMD_AT);
                sb.append(name);
                sb.append(BinaryUtils.CMD_EXCLAMATION);
                sb.append(phone);
                sb.append(BinaryUtils.CMD_NUMBER);
                sb.append(qrCodeType);
                sb.append(BinaryUtils.CMD_DOLLAR);
                sb.append(travelCodeType);
            }else{
                sb.append(responseStatus);
            }


            return BsjMessageBuilder.create().buildBsjWritePropertyMessage(m,sb.toString());
        }else{
            if (log.isDebugEnabled()) {
                log.debug("非WritePropertyMessage指令{}消息{}",CommandEnum.GET_HEALTH_INFO.name(),message);
            }
            return null;
        }
    }
}
